/*
 * lector64.cpp
 *
 *  Created on: 18/11/2014
 *      Author: juan manuel
 */

#include "lector64.h"

#include "NGramas64.h"
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
#include <set>
#include <locale>
//#define NOMBRE_TRAIN_SET "train_v2.txt"
//#define NOMBRE_TRAIN_SET "train_de_prueba.txt"
//#define NOMBRE_TRAIN_SET "C:/Users/juan manuel/Documents/tp-organizacion-de-datos-billion-words/TP Oreganizacion de Datos/TP Oreganizacion de Datos/train_de_prueba.txt"
#define NOMBRE_TRAIN_SET "C:/Users/juan manuel/Documents/tp-organizacion-de-datos-billion-words/TP Oreganizacion de Datos/TP Oreganizacion de Datos/train_v2.txt"

//extern map<string,sFreqArchivo> diccionario;
extern map<string,datosDeUnaPAlabraDelDiccionario> diccionarioCompleto;



int fragmentoUsado = -1;
set<string> palabrasAparecidasEnElFragmento;

map<string, ofstream*> mapaPalabraArchivoDeApariciones;

map<string, set<int>*> mapa;



bool yaAparecioEnFragmento(string palabra){

	if ( palabrasAparecidasEnElFragmento.find(palabra) == palabrasAparecidasEnElFragmento.end() ){
		//Si es T entonces la palabra no se encontro
		palabrasAparecidasEnElFragmento.insert(palabra);
		return false;
	}
	else{
		return true;
	}

}










void agregarAparicion(string palabra, int fragmento){
	//ANTES SE DEBEN CARGAR LAS PALABRASS
	diccionarioCompleto[palabra].apariciones->insert(fragmento);
}



//El & es para pasalo por referencia, si no se pasar�a por valor y perder�a tiempo copiando el vector
void agregarApariciones(vector<string> &vectorDePalabras, int fragmentoActual){

	if ( fragmentoActual != fragmentoUsado ){
		palabrasAparecidasEnElFragmento.clear();
		fragmentoUsado = fragmentoActual;
	}

	string palabra;
	size_t tam = vectorDePalabras.size();
	for(size_t i = 0; i < tam; i++){
		palabra = vectorDePalabras.at(i);

		if( !yaAparecioEnFragmento(palabra) ){
			agregarAparicion(palabra, fragmentoActual);
		}
	}
}

bool palabraTerminaEnPunto(string palabra){

	if ( (*palabra.rbegin()) == '.' ){
		return true;
	}
	else {
		return false;
	}
}












void aprender(){

	string fileName = NOMBRE_TRAIN_SET;
	ifstream train;
	train.open(fileName.c_str());
	string palabra;

	vector<string> vectorDeFrase;
	int fragmentoActual;


	if(train.is_open()){

		//train.seekg(0);

		train.seekg(4000000006);

		while(train >> palabra &&  (train.tellg()<4250000000)){

			if ( palabraTerminaEnPunto(palabra) ){

				vectorDeFrase.push_back(palabra);

				fragmentoActual = train.tellg()/23000;

				agregarTrigramas(vectorDeFrase);
				agregarApariciones(vectorDeFrase, fragmentoActual);



				vectorDeFrase.clear();
			}
			else{
				vectorDeFrase.push_back(palabra);
			}
		}
		cout<<"El ultimo punto de lectura fue: "<<train.tellg()<<"\n";
		train.close();
	}
}
